import base64
import pickle
from django_redis import get_redis_connection


def merge_cart_cookie_to_redis(request, user, response):
    """
    登录后合并cookie购物车数据到Redis
    :param request: 本次请求对象，获取cookie中的数据
    :param response: 本次响应对象，清除cookie中的数据
    :param user: 登录用户信息，获取user_id
    :return: response
    """
    print("---------111--------")
    # 1 获取cookie中购物车数据
    carts_str = request.COOKIES.get("carts")

    # 2 判断取出cookie中的数据是否存在
    if not carts_str:
        return response

    # 成功取出数据, 解码转化byte在转成python字典
    carts_dict = pickle.loads(base64.b64decode(carts_str.encode()))
    print(carts_dict, "查询出来的商品的id")  # 解码出： {13（商品的id）: {'count（商品的数量）': 1, 'selected'（勾选）: True}}
    print("--------2---------")
    # 定义字典
    news_carts_dict = {}
    news_carts_selected_add = []
    news_carts_selected_remove = []

    # 同步cookie数据购物车
    for sku_id, cookie_dict in carts_dict.items():
        news_carts_dict[sku_id] = cookie_dict["count"]    # 字典中的键值对操作
        print(news_carts_dict, "news_carts_dict")  # {"商品id": "商品数量"}
        if cookie_dict["selected"]:
            # 为true
            news_carts_selected_add.append(sku_id)  # 把cookie购物车商品并且是勾选商品的添加到新的列表中
            print(news_carts_selected_add, "news_carts_selected_add")
        else:
            news_carts_selected_remove.append(sku_id)  # 把cookie购物车商品不是勾选商品的添加进去

    # 02 连接redis
    redis_conn = get_redis_connection("carts")
    pl = redis_conn.pipeline()

    pl.hmset("carts_%s" % user.id, news_carts_dict)  # 去重

    # 将勾选选项同步到redis
    if news_carts_selected_add:
        pl.sadd("selected_%s" % user.id, *news_carts_selected_add)

    if news_carts_selected_remove:
        pl.srem("selected_%s" % user.id, *news_carts_selected_remove)
    pl.execute()

    # 清除cookie
    response.delete_cookie("carts")

    return response
